package cn.zifangsky.jvm.part2.threadlocal;

/**
 * {@link ThreadLocal} 实现原理分析
 *
 * @author zifangsky
 * @date 2020/7/11
 * @since 1.0.0
 */
public class ThreadLocalPrinciple {

    public static void main(String[] args) {
        ThreadLocal<String> local = new ThreadLocal<>();
        //将ThreadLocal作为key放入ThreadLocal.ThreadLocalMap.Entry中，value为当前线程名
        local.set(Thread.currentThread().getName());

        /**
         * 注意断点看此时的Thread.ThreadLocalMap.Entry数组刚设置的referent是指向Local的，
         * referent就是Entry中的key只是被WeakReference包装了一下
         */
        Thread t = Thread.currentThread();

        /**
         * 断开强引用，即断开local与referent的关联，但Entry中此时的referent还是指向Local的，
         * 为什么会这样？当引用传递设置为null时无法影响传递内的结果
         */
        local = null;

        //执行GC
        System.gc();

        /**
         * 这时Entry中referent是null了，被GC掉了，因为Entry和key的关系是WeakReference，
         * 并且在没有其他强引用的情况下就被回收掉了
         */
        t = Thread.currentThread();
        System.out.println(local);
    }

}
